
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>偏向锁和轻量级锁机制 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>偏向锁和轻量级锁机制 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">偏向锁的设计初衷是什么？它基于何种观察？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">偏向锁的设计初衷是提升无竞争场景下的性能。它基于一个常见的观察：在许多场景中，锁的持有者往往不会发生变化，即同一线程多次重复获取同一个锁。偏向锁通过“偏向”第一次获得锁的线程，使其后续可以直接进入同步块，从而大幅提升无竞争场景下的性能。</div>
          </div>
          <div class="card-source">来源: 偏向锁（Biased Locking） -> 1. 背景与设计初衷</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当另一个线程尝试获取一个已经被偏向的锁时，会发生什么？这个过程有什么开销？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当另一线程尝试获取已经偏向的锁时，偏向锁会被撤销。JVM通过CAS操作将偏向锁升级为轻量级锁或重量级锁。这个撤销过程会触发STW（Stop-The-World），暂停所有线程对偏向锁进行清理和重置，具有一定的开销。</div>
          </div>
          <div class="card-source">来源: 偏向锁（Biased Locking） -> 2. 工作机制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">轻量级锁旨在优化哪种场景？它通过什么技术来避免传统锁的高昂开销？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">轻量级锁旨在优化低竞争场景下的锁开销，即多个线程可以顺利进入临界区而无需长时间等待。它利用自旋锁和CAS（Compare-And-Swap）操作来代替传统重量级锁的操作系统挂起和唤醒机制，从而减少线程切换和内核调用的代价。</div>
          </div>
          <div class="card-source">来源: 轻量级锁（Lightweight Locking） -> 1. 背景与设计初衷</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">轻量级锁的加锁流程是怎样的？它如何利用栈帧和CAS操作？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当线程请求锁时，JVM会在该线程的栈帧中创建一个锁记录（Lock Record）。然后，JVM通过CAS操作，尝试将对象头中的Mark Word替换为指向该锁记录的指针。如果CAS操作成功，线程就成功获取了轻量级锁；如果失败，则表示存在竞争，锁会升级。</div>
          </div>
          <div class="card-source">来源: 轻量级锁（Lightweight Locking） -> 2. 工作机制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Java虚拟机中的锁可以升级吗？如果可以，其升级路径是怎样的？是否支持锁降级？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Java的锁机制支持锁的升级，但不支持锁的降级。升级过程是由偏向锁到轻量级锁，再到重量级锁的递进过程。当竞争出现时，偏向锁会升级为轻量级锁；当轻量级锁的竞争持续存在时，会升级为重量级锁。</div>
          </div>
          <div class="card-source">来源: 底层实现 -> 5. 锁的升级与降级</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在JVM的锁实现中，对象头里的Mark Word扮演了什么角色？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Mark Word用于存储对象的锁状态、线程ID和其他元信息。根据锁状态的不同（无锁、偏向锁、轻量级锁、重量级锁），它会存储不同的内容：例如，在偏向锁状态下记录线程ID，在轻量级锁状态下存储指向栈中锁记录的指针，在重量级锁状态下存储指向Monitor对象的指针。</div>
          </div>
          <div class="card-source">来源: 底层实现 -> 1. 对象头（Mark Word）与锁标记位</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">重量级锁是如何实现的？其性能开销主要来源于哪里？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">重量级锁通过操作系统的Monitor对象来实现，依赖于操作系统的互斥量（mutex）。当一个线程获得锁后，其他竞争线程会被阻塞并进入等待队列。其性能开销主要来源于不可避免的上下文切换和系统调用，因为线程的阻塞和唤醒涉及内核态和用户态之间的切换。</div>
          </div>
          <div class="card-source">来源: 底层实现 -> 4. 重量级锁的实现</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">偏向锁、轻量级锁和重量级锁分别最适用于哪些并发场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 偏向锁：适用于无竞争或单线程复用锁的场景。<br>2. 轻量级锁：适用于存在少量竞争且锁持有时间很短的场景。<br>3. 重量级锁：适用于高竞争场景，即多个线程同时争抢锁且锁持有时间较长的情况。</div>
          </div>
          <div class="card-source">来源: 适用场景与选择</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">为什么JVM要引入偏向锁和轻量级锁这些分层优化策略，而不是直接使用重量级锁？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要目的是为了在不同并发场景下平衡性能和线程安全。传统重量级锁在频繁请求下因涉及线程挂起和上下文切换而开销极高。偏向锁和轻量级锁通过在低竞争或无竞争场景下减少或避免线程阻塞，降低了上下文切换频率，从而最小化锁开销，提升了多线程应用的整体性能。</div>
          </div>
          <div class="card-source">来源: 为什么有这些机制 -> 1. 减少线程的上下文切换和阻塞</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
